package com.hunliji.monitor.share.component.lock.config;

import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * redisson 配置
 * 如果要使用分布式锁，并且使用redisson模式
 * 请确保系统中有且只有一个当前配置
 * todo：调研目前的方案的风险，超时重试是否可以基于redisson去实现
 * @author wuchen
 */
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedissonConfig {
    /**
     * redis的host
     */
    private String host;
    /**
     * redis的端口
     */
    private String port;
    /**
     * redis的密码
     */
    private String password;
    /**
     * 使用了哪个库
     */
    private Integer database;
    /**
     * 连接池的大小
     */
    private static final Integer CONNECTION_POOL_SIZE = 20;
    /**
     * 最小空闲连接数
     */
    private static final Integer CONNECTION_MINIMUM_IDLE_SIZE = 10;
    /**
     * 连接的超时时间
     */
    private static final Integer CONNECT_TIMEOUT = 3000;
    /**
     * 命令等待超时时间
     */
    private static final Integer TIMEOUT = 1000;
    @Bean
    public RedissonClient getRedisson() {
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://" + host + ":" + port)
                .setPassword(password)
                .setDatabase(database)
                //设置连接池的大小
                .setConnectionPoolSize(CONNECTION_POOL_SIZE)
                //最小空闲大小
                .setConnectionMinimumIdleSize(CONNECTION_MINIMUM_IDLE_SIZE)
                //连接的超时时间
                .setConnectTimeout(CONNECT_TIMEOUT)
                //命令等待超时，默认3s，设置成1s
                .setTimeout(TIMEOUT);
        return Redisson.create(config);
    }
}
